package JavaEE.ManyThread3;
import java.util.*;
public class Demo2 {
    // 锁:将"非原子"的操作加锁,变成"原子"操作

    // 锁的用法:
    // 1. synchronized(锁对象){} [重点,最常使用]
    // 2. 修饰一个普通方法,可以省略"锁对象" [不常用]
    // 3. 修饰一个静态static方法,可以省略"锁对象" [基本不用]
    public static Object locker = new Object();
    public static int n;
    // 修饰一个普通方法,可以省略"锁对象"
    // "并不是没有锁对象,而是相当于针对this加锁,可以省略"
    static class temp{
        private int n = 0;
        synchronized public void add(){
            n++;
        }
    }
    // 修饰一个static静态方法,可以省略"锁对象"
    // (静态类/方法,是没有this的,但不代表没有锁对象,而是此时 针对"类对象"加锁)
    synchronized static void add(){
        n++;
    }
    public static void main(String[] args) throws InterruptedException{
        temp t = new temp();
        Thread t1 = new Thread(() -> {
            for(int i = 0;i < 50000;i++){
                t.add();
                //add();
            }
        });
        Thread t2 = new Thread(() -> {
            for(int i = 0;i < 50000;i++){
                synchronized (locker) {
                    t.add();
                    //add();
                }
            }
        });
        t1.start();
        t2.start();

        t1.join();
        t2.join();
        // 期望:100000
        // 实际: < 100000
        System.out.println(t.n);//n
    }
}
